﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using itau.im.relatorios.entidade;
using EnterpriseLibraryWrapper;
using System.Data;

namespace itau.im.relatorios.dado
{
    public class RelatorioParametroDB : IRelatorioParametroDAO
    {
        public IList<ParametroRegra> ObterParametroAtribuicaoPorRegraDataVigencia(int codigoRegraAtribuicao, DateTime dataInicioVigencia)
        {
            //Declaração dos objetos
            IDataAccessWrapper data = null;
            List<ParametroRegra> lista = new List<ParametroRegra>();
            DataSet ds;

            try
            {
                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                data.ParameterIn.Add(new ParameterInWrapper("@COD_REGR_ATRI_CUR", codigoRegraAtribuicao, DbType.Int32));
                data.ParameterIn.Add(new ParameterInWrapper("@DAT_INIO_VIGE", dataInicioVigencia, DbType.DateTime));

                //Executa a procedure IMS37
                ds = data.ExecuteDataSet("DB2IM.IMS37");

                //Verifica se o retorno é válido
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        lista.Add(EntidadeFactory.getParametroRegra(linha));
                    }
                }

                //Retorna a consulta
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //Desaloca os objetos
                data.Dispose();
                data = null;
                ds = null;
                lista = null;
            }

            //Retorna a consulta
            return new List<ParametroRegra>();
        }

        public IList<ParametroAtribuicao> ObterParametrosNaoAlocadosPorGrupoParametroVigente(int codigoGrupo)
        {
            //Declara os objetos
            List<ParametroAtribuicao> listaParametrosExogenos;
            IDataAccessWrapper data = null;
            DataSet ds;

            try
            {
                // Instância o objeto
                listaParametrosExogenos = new List<ParametroAtribuicao>();

                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                data.ParameterIn.Add(new ParameterInWrapper("@WCOD_GRUP_PARM_ATR", codigoGrupo, DbType.Int32));

                //Recupera a consulta
                ds = data.ExecuteDataSet("DB2IM.IMS22");

                //Verifica se é válido o retorno
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        listaParametrosExogenos.Add(EntidadeFactory.getParametroAtribuicao(linha));
                    }
                }
                //Retorna a consulta
                return listaParametrosExogenos;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                listaParametrosExogenos = null;
                data.Dispose();
                data = null;
                ds = null;
            }

            //Retorna a consulta vazia
            return new List<ParametroAtribuicao>();
        }

        public IList<ParametroAtribuicaoGrupoAlocacao> ObterParametrosAtribuicaoGrupoAlocacaoPorGrupoParametrosVigente(int codigoGrupo)
        {
            //Declara e instancia o objeto
            List<ParametroAtribuicaoGrupoAlocacao> listaRetorno = new List<ParametroAtribuicaoGrupoAlocacao>();
            IDataAccessWrapper data = null;
            DataSet ds;

            try
            {
                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                //Adiciona os parâmetros
                data.ParameterIn.Add(new ParameterInWrapper("@COD_GRUP_PARM_ATRI", codigoGrupo, DbType.Int32));

                //Recupera a consulta
                ds = data.ExecuteDataSet("DB2IM.IMS13");

                //Verifica se é válido o retorno
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        listaRetorno.Add(EntidadeFactory.getParametroAtribuicaoGrupoAlocacao(linha));
                    }
                }

                return listaRetorno;

            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //Finaliza os objetos
                data.Dispose();
                data = null;
                ds = null;
                listaRetorno = null;
            }

            //Retorna a consulta
            return new List<ParametroAtribuicaoGrupoAlocacao>();
        }

        public IList<ParametroAtribuicao> ObterParametrosAtribuicaoPorGrupoVigente(int codigoGrupo)
        {
            List<ParametroAtribuicao> lista;
            IDataAccessWrapper data = null;
            DataSet ds;

            try
            {
                lista = new List<ParametroAtribuicao>();

                data = EnterpriseLibraryFactory.GetDataAccess();

                data.ParameterIn.Add(new ParameterInWrapper("@COD_GRUP_PARM_ATR", codigoGrupo, DbType.Int32));

                ds = data.ExecuteDataSet("DB2IM.IMS16");

                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        lista.Add(EntidadeFactory.getParametroAtribuicao2(linha));
                    }
                }

                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                lista = null;
                data.Dispose();
                data = null;
                ds = null;
            }

            return new List<ParametroAtribuicao>();
        }

        public IList<TipoParametroValor> ObterTiposParametroValor()
        {
            //Declara e os objetos
            List<TipoParametroValor> lista = null;
            IDataAccessWrapper data = null;
            DataSet ds = null;
            try
            {
                lista = new List<TipoParametroValor>();

                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                //Recupera a consulta
                ds = data.ExecuteDataSet("DB2IM.IMSJE");

                //Verifica se é válido o retorno
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        lista.Add(EntidadeFactory.getTipoParametroValor(linha));
                    }
                }

                //Retorna a consulta
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //Desaloca os objetos
                lista = null;
                data.Dispose();
                data = null;
                ds = null;
            }
            //Retorna o objeto limpo
            return new List<TipoParametroValor>();
        }

        public IList<DominioParametroAtribuicao> ObterDominiosParametrosAtribuicaoPorGrupoVigente(int codigoGrupo)
        {
            //Declara os objetos
            List<DominioParametroAtribuicao> lista;
            IDataAccessWrapper data = null;
            DataSet ds;

            try
            {
                // Instância o objeto
                lista = new List<DominioParametroAtribuicao>();

                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                data.ParameterIn.Add(new ParameterInWrapper("@WCOD_GRUP_PARM_ATR", codigoGrupo, DbType.Int32));

                //Recupera a consulta
                ds = data.ExecuteDataSet("DB2IM.IMS18");

                //Verifica se é válido o retorno
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        lista.Add(EntidadeFactory.getDominioParametroAtribuicao(linha));
                    }
                }
                //Retorna a consulta
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                lista = null;
                data.Dispose();
                data = null;
                ds = null;
            }

            //Retorna a consulta vazia
            return new List<DominioParametroAtribuicao>();
        }

        public IList<DominioParametroAtribuicao> ObterRegistrosDominioParametro(int codigoParametro)
        {
            //Declara e instância o objeto
            List<DominioParametroAtribuicao> lista = new List<DominioParametroAtribuicao>();
            IDataAccessWrapper data = null;
            DataSet ds;

            try
            {
                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                //Adiciona o parametro de entrada
                data.ParameterIn.Add(new ParameterInWrapper("@COD_PARM_ATRI", codigoParametro, DbType.Int32));
                //data.ParameterIn.Add(new ParameterInWrapper("@COD_CLAS_PROD", DBNull.Value, DbType.Int32));

                //Recupera a consulta
                ds = data.ExecuteDataSet("DB2IM.IMSJH");

                //Verifica se é válido o retorno
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        lista.Add(EntidadeFactory.getDominioParametroAtribuicao(linha));
                    }
                }

                //Retorna consulta
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                lista = null;
                data.Dispose();
                data = null;
                ds = null;
            }

            //Retorna a consulta limpa
            return new List<DominioParametroAtribuicao>();
        }

        public IList<ParametroAtribuicao> ObterParametros()
        {
            //Declara os objetos;
            List<ParametroAtribuicao> lista = null;
            IDataAccessWrapper data = null;
            DataSet ds = null;

            try
            {
                //Instancia o objeto
                lista = new List<ParametroAtribuicao>();

                //Recupera o objeto de acesso a dados
                data = EnterpriseLibraryFactory.GetDataAccess();

                //Recupera a consulta
                ds = data.ExecuteDataSet("DB2IM.IMSJC");

                //Verifica se é válido o retorno
                if (ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
                {
                    //Percorre todos os registros da tabela
                    foreach (DataRow linha in ds.Tables[0].Rows)
                    {
                        //Monta e adiciona o objeto na lista
                        lista.Add(EntidadeFactory.getParametroAtribuicao(linha));
                    }
                }

                //Retorna a consulta
                return lista;
            }
            catch (DadosException ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            catch (Exception ex)
            {
                EnterpriseLibraryFactory.GetExceptionHandler().HandleException(ex, "ErrosDados");
            }
            finally
            {
                //Desaloca os objetos
                lista = null;
                data.Dispose();
                data = null;
                ds = null;
            }
            //Retorna o objeto limpo
            return new List<ParametroAtribuicao>();
        }
    }
}
